/**
 * 2018年12月7日上午6:53:02
 * @author 谢进财
 */
package com.baihang.platform.shiro;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

/**
 * 默认情况下，配置权限控制的时候，如 /test/**=roles[role1,admin],结果是需要用户同时拥有role1和admin权限才能访问/test/**路径
 * 这往往不符合我们的需求，大部分情况，我们希望的是用户拥有role1和admin任一角色即可。
 * 我们需要重写过滤器
 */
public class AnyRolesAuthorizationFilter extends AuthorizationFilter {

	/* (non-Javadoc)
	 * @see org.apache.shiro.web.filter.AccessControlFilter#isAccessAllowed(javax.servlet.ServletRequest, javax.servlet.ServletResponse, java.lang.Object)
	 */
	@Override
	protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue) throws Exception {
		Subject subject = getSubject(req, resp);
        String[] rolesArray = (String[]) mappedValue;//获取角色数组

        if (rolesArray == null || rolesArray.length == 0) //空的，表示没有限制
        {
            return true;
        }
        for (int i = 0; i < rolesArray.length; i++)
        {
            if (subject.hasRole(rolesArray[i]))
            {
                return true;
            }
        }
        return false;
	}

}
